<html>
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/>
  <title>
   机器学习经典算法详解及Python实现–K近邻(KNN)算法  | 数螺 | NAUT IDEA
  </title>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" rel="stylesheet"/>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
  <style type="text/css">
   #xmain img {
                  max-width: 100%;
                  display: block;
                  margin-top: 10px;
                  margin-bottom: 10px;
                }

                #xmain p {
                    line-height:150%;
                    font-size: 16px;
                    margin-top: 20px;
                }

                #xmain h2 {
                    font-size: 24px;
                }

                #xmain h3 {
                    font-size: 20px;
                }

                #xmain h4 {
                    font-size: 18px;
                }


                .header {
	           background-color: #0099ff;
	           color: #ffffff;
	           margin-bottom: 20px;
	        }

	        .header p {
                  margin: 0px;
                  padding: 10px 0;
                  display: inline-block;  
                  vertical-align: middle;
                  font-size: 16px;
               }

               .header a {
                 color: white;
               }

              .header img {
                 height: 25px;
              }
  </style>
  <script src="http://cdn.bootcss.com/jquery/3.0.0/jquery.min.js">
  </script>
  <script src="http://nautstatic-10007657.file.myqcloud.com/static/css/readability.min.js" type="text/javascript">
  </script>
  <script type="text/javascript">
   $(document).ready(function() {
                 var loc = document.location;
                 var uri = {
                  spec: "http://dataunion.org/4237.html",
                  host: "http://dataunion.org",
                  prePath: "http://dataunion.org",
                  scheme: "http",
                  pathBase: "http://dataunion.org/"
                 };
    
                 var documentClone = document.cloneNode(true);
                 var article = new Readability(uri, documentClone).parse();
     
                 document.getElementById("xmain").innerHTML = article.content;
                });
  </script>
  <!-- 1466460653: Accept with keywords: (title(0.4):Python,算法,社区,数盟,经典, topn(0.6):社区,表决,人工智能,数盟,文章,行业资讯,汉明,类别,加权,交叉,特征,标签,预测值,参数,计算,图像,数据,度量,权重,回归,样本,算法,实例,训练样本,测试点,方法,分类,距离,Python,归一化).-->
 </head>
 <body onload="">
  <div class="header">
   <div class="container">
    <div class="row">
     <div class="col-xs-6 col-sm-6 text-left">
      <a href="/databee">
       <img src="http://nautidea-10007657.cos.myqcloud.com/logo_white.png"/>
      </a>
      <a href="/databee">
       <p>
        数螺
       </p>
      </a>
     </div>
     <div class="hidden-xs col-sm-6 text-right">
      <p>
       致力于数据科学的推广和知识传播
      </p>
     </div>
    </div>
   </div>
  </div>
  <div class="container text-center">
   <h1>
    机器学习经典算法详解及Python实现–K近邻(KNN)算法
   </h1>
  </div>
  <div class="container" id="xmain">
   ﻿﻿
   <title>
    机器学习经典算法详解及Python实现–K近邻(KNN)算法 | 数盟社区
   </title>
   <!-- All in One SEO Pack 2.2.7.6.2 by Michael Torbert of Semper Fi Web Design[32,83] -->
   <!-- /all in one seo pack -->
   <!--
<div align="center">
<a href="http://strata.oreilly.com.cn/hadoop-big-data-cn?cmp=mp-data-confreg-home-stcn16_dataunion_pc" target="_blank"><img src="http://dataunion.org/wp-content/uploads/2016/05/stratabj.jpg"/ ></a>
</div>
-->
   <header id="header-web">
    <div class="header-main">
     <hgroup class="logo">
      <h1>
       <a href="http://dataunion.org/" rel="home" title="数盟社区">
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/logo.png"/>
       </a>
      </h1>
     </hgroup>
     <!--logo-->
     <nav class="header-nav">
      <ul class="menu" id="menu-%e4%b8%bb%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-71" id="menu-item-71">
        <a href="http://dataunion.org/category/events" title="events">
         活动
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22457" id="menu-item-22457">
          <a href="http://dataunion.org/2016timeline">
           2016档期
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22459" id="menu-item-22459">
          <a href="http://dataunion.org/category/parterc">
           合作会议
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor menu-item-has-children menu-item-20869" id="menu-item-20869">
        <a href="http://dataunion.org/category/tech" title="articles">
         文章
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20867" id="menu-item-20867">
          <a href="http://dataunion.org/category/tech/base" title="base">
           基础架构
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-3302" id="menu-item-3302">
          <a href="http://dataunion.org/category/tech/ai" title="ai">
           人工智能
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3303" id="menu-item-3303">
          <a href="http://dataunion.org/category/tech/analysis" title="analysis">
           数据分析
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21920" id="menu-item-21920">
          <a href="http://dataunion.org/category/tech/dm">
           数据挖掘
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3314" id="menu-item-3314">
          <a href="http://dataunion.org/category/tech/viz" title="viz">
           可视化
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3305" id="menu-item-3305">
          <a href="http://dataunion.org/category/tech/devl" title="devl">
           编程语言
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20876" id="menu-item-20876">
        <a href="http://dataunion.org/category/industry">
         行业
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-16328" id="menu-item-16328">
          <a href="http://dataunion.org/category/industry/case" title="case">
           行业应用
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-2112" id="menu-item-2112">
          <a href="http://dataunion.org/category/industry/demo" title="demo">
           Demo展示
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21562" id="menu-item-21562">
          <a href="http://dataunion.org/category/industry/news">
           行业资讯
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-311" id="menu-item-311">
        <a href="http://dataunion.org/category/sources" title="sources">
         资源
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20870" id="menu-item-20870">
        <a href="http://dataunion.org/category/books" title="book">
         图书
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21363" id="menu-item-21363">
        <a href="http://dataunion.org/category/training">
         课程
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-21853" id="menu-item-21853">
        <a href="http://dataunion.org/category/jobs">
         职位
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22050" id="menu-item-22050">
          <a href="http://dataunion.org/category/career">
           职业规划
          </a>
         </li>
        </ul>
       </li>
      </ul>
     </nav>
     <!--header-nav-->
    </div>
   </header>
   <!--header-web-->
   <div id="main">
    <div id="soutab">
     <form action="http://dataunion.org/" class="search" method="get">
     </form>
    </div>
    <div id="container">
     <nav id="mbx">
      当前位置：
      <a href="http://dataunion.org">
       首页
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech">
       文章
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech/ai">
       人工智能
      </a>
      &gt;  正文
     </nav>
     <!--mbx-->
     <article class="content">
      <header align="centre" class="contenttitle">
       <div class="mscc">
        <h1 class="mscctitle">
         <a href="http://dataunion.org/4237.html">
          机器学习经典算法详解及Python实现–K近邻(KNN)算法
         </a>
        </h1>
        <address class="msccaddress ">
         <em>
          5,421 次阅读 -
         </em>
         <a href="http://dataunion.org/category/tech/ai" rel="category tag">
          人工智能
         </a>
        </address>
       </div>
      </header>
      <div class="content-text">
       <h1>
        <span style="font-size: 10pt;">
         作者：
         <a class="user_name" href="http://my.csdn.net/suipingsp" target="_blank">
          suipingsp
         </a>
        </span>
       </h1>
       <h1>
        （一）KNN依然是一种监督学习算法
       </h1>
       <p>
        KNN（K Nearest Neighbors,K近邻 ）算法是机器学习所有算法中理论最简单，最好理解的。KNN是一种基于实例的学习，通过计算新数据与训练数据特征值之间的距离，然后选取K（K&gt;=1）个距离最近的邻居进行分类判断（投票法）或者回归。如果K=1，那么新数据被简单分配给其近邻的类。KNN算法算是监督学习还是无监督学习呢？首先来看一下监督学习和无监督学习的定义。对于监督学习，数据都有明确的label（分类针对离散分布，回归针对连续分布），根据机器学习产生的模型可以将新数据分到一个明确的类或得到一个预测值。对于非监督学习，数据没有label，机器学习出的模型是从数据中提取出来的pattern（提取决定性特征或者聚类等）。例如聚类是机器根据学习得到的模型来判断新数据“更像”哪些原数据集合。KNN算法用于分类时，每个训练数据都有明确的label，也可以明确的判断出新数据的label，KNN用于回归时也会根据邻居的值预测出一个明确的值，因此KNN属于监督学习。
        <br/>
        KNN算法的过程为:
       </p>
       <ol>
        <li>
         选择一种距离计算方式, 通过数据所有的特征计算新数据与已知类别数据集中的数据点的距离
        </li>
       </ol>
       <ol>
        <li>
         按照距离递增次序进行排序，选取与当前距离最小的k个点
        </li>
       </ol>
       <ol>
        <li>
         对于离散分类，返回k个点出现频率最多的类别作预测分类；对于回归则返回k个点的加权值作为预测值
        </li>
       </ol>
       <h1>
        <p name="t1">
        </p>
        （二）KNN算法关键
       </h1>
       <p>
        KNN算法的理论和过程就是那么简单，为了使其获得更好的学习效果，有下面几个需要注意的地方。
        <br/>
        1、数据的所有特征都要做可比较的量化。
        <br/>
        若是数据特征中存在非数值的类型，必须采取手段将其量化为数值。举个例子，若样本特征中包含颜色（红黑蓝）一项，颜色之间是没有距离可言的，可通过将颜色转换为灰度值来实现距离计算。另外，样本有多个参数，每一个参数都有自己的定义域和取值范围，他们对distance计算的影响也就不一样，如取值较大的影响力会盖过取值较小的参数。为了公平，样本参数必须做一些scale处理，最简单的方式就是所有特征的数值都采取归一化处置。
        <br/>
        2、需要一个distance函数以计算两个样本之间的
        <strong>
         距离。
         <br/>
        </strong>
        距离的定义有很多，如欧氏距离、余弦距离、汉明距离、曼哈顿距离等等，关于相似性度量的方法可参考‘
        <a href="http://www.cnblogs.com/daniel-D/p/3244718.html" id="cb_post_title_url" target="_blank">
         漫谈：机器学习中距离和相似性度量方法
        </a>
        ’。一般情况下，选欧氏距离作为距离度量，但是这是只适用于连续变量。在文本分类这种非连续变量情况下，汉明距离可以用来作为度量。通常情况下，如果运用一些特殊的算法来计算度量的话，K近邻分类精度可显著提高，如运用大边缘最近邻法或者近邻成分分析法。
        <br/>
        3，确定K的值
        <br/>
        K是一个自定义的常数，K的值也直接影响最后的估计，一种选择K值得方法是使用
        <wbr>
        </wbr>
        cross-validate（交叉验证）误差统计选择法
        <strong>
         。
        </strong>
        交叉验证的概念之前提过，就是数据样本的一部分作为训练样本，一部分作为测试样本，比如选择95%作为训练样本，剩下的用作测试样本。通过训练数据训练一个机器学习模型，然后利用测试数据测试其误差率。
        <wbr>
        </wbr>
        cross-validate（交叉验证）误差统计选择法就是比较不同K值时的交叉验证平均误差率，选择误差率最小的那个K值。例如选择K=1,2,3,…
        <wbr>
        </wbr>
        ，
        <wbr>
        </wbr>
        <wbr>
        </wbr>
        对每个K=i做100次交叉验证，计算出平均误差，然后比较、选出最小的那个
        <strong>
         。
         <br/>
        </strong>
       </p>
       <h1>
        <p name="t2">
        </p>
        （三）KNN分类
       </h1>
       <p>
        训练样本是多维特征空间向量，其中每个训练样本带有一个类别标签（喜欢或者不喜欢、保留或者删除）。分类算法常采用“多数表决”决定，即k个邻居中出现次数最多的那个类作为预测类。“多数表决”分类的一个缺点是出现频率较多的样本将会主导测试点的预测结果，那是因为他们比较大可能出现在测试点的K邻域而测试点的属性又是通过K领域内的样本计算出来的。解决这个缺点的方法之一是在进行分类时将K个邻居到测试点的距离考虑进去。例如，若样本到测试点距离为d，则选1/d为该邻居的权重（也就是得到了该邻居所属类的权重），接下来统计统计k个邻居所有类标签的权重和，值最大的那个就是新数据点的预测类标签。
        <br/>
        举例，K=5，计算出新数据点到最近的五个邻居的举例是（1,3,3,4,5），五个邻居的类标签是（yes，no，no，yes，no）
        <br/>
        若是按照多数表决法，则新数据点类别为no（3个no，2个yes）；若考虑距离权重类别则为yes（no：2/3+1/5,yes：1+1/4）。
        <br/>
        下面的Python程序是采用KNN算法的实例（计算欧氏距离，多数表决法决断）：一个是采用KNN算法改进约会网站配对效果，另一个是采用KNN算法进行手写识别。
        <br/>
        约会网站配对效果改进的例子是根据男子的每年的飞行里程、视频游戏时间比和每周冰激凌耗量三个特征来判断其是否是海伦姑娘喜欢的类型（类别为很喜欢、一般和讨厌），决策采用多数表决法。由于三个特征的取值范围不同，这里采用的scale策略为归一化。
        <br/>
        使用KNN分类器的手写识别系统 只能识别数字0到9。需要识别的数字使用图形处理软件，处理成具有相同的色 彩和大小 ：宽髙是32像素X32像素的黑白图像。尽管采用文本格式存储图像不能有效地利用内存空间,为了方便理解，这里已经将将图像转换为文本格式。训练数据中每个数字大概有200个样本，程序中将图像样本格式化处理为向量,即一个把一个32×32的二进制图像矩阵转换为一个1×1024的向量。
       </p>
       <div class="dp-highlighter bg_python">
        <div class="bar">
         <div class="tools">
         </div>
        </div>
        <ol class="dp-py" start="1">
         <li class="alt">
          <span class="keyword">
           from
          </span>
          numpy
          <span class="keyword">
           import
          </span>
          *
         </li>
         <li class="">
          <span class="keyword">
           import
          </span>
          operator
         </li>
         <li class="alt">
          <span class="keyword">
           from
          </span>
          os
          <span class="keyword">
           import
          </span>
          listdir
         </li>
         <li class="">
          <span class="keyword">
           import
          </span>
          matplotlib
         </li>
         <li class="alt">
          <span class="keyword">
           import
          </span>
          matplotlib.pyplot as plt
         </li>
         <li class="">
          <span class="keyword">
           import
          </span>
          pdb
         </li>
         <li class="alt">
         </li>
         <li class="">
          <span class="keyword">
           def
          </span>
          classify0(inX, dataSet, labels, k=
          <span class="number">
           3
          </span>
          ):
         </li>
         <li class="alt">
          <span class="comment">
           #pdb.set_trace()
          </span>
         </li>
         <li class="">
          dataSetSize = dataSet.shape[
          <span class="number">
           0
          </span>
          ]
         </li>
         <li class="alt">
          diffMat = tile(inX, (dataSetSize,
          <span class="number">
           1
          </span>
          )) – dataSet
         </li>
         <li class="">
          sqDiffMat = diffMat**
          <span class="number">
           2
          </span>
         </li>
         <li class="alt">
          sqDistances = sqDiffMat.sum(axis=
          <span class="number">
           1
          </span>
          )
         </li>
         <li class="">
          distances = sqDistances**
          <span class="number">
           0.5
          </span>
         </li>
         <li class="alt">
          sortedDistIndicies = distances.argsort()
          <span class="comment">
           #ascend sorted,
          </span>
         </li>
         <li class="">
          <span class="comment">
           #return the index of unsorted, that is to choose the least 3 item
          </span>
         </li>
         <li class="alt">
          classCount={}
         </li>
         <li class="">
          <span class="keyword">
           for
          </span>
          i
          <span class="keyword">
           in
          </span>
          range(k):
         </li>
         <li class="alt">
          voteIlabel = labels[sortedDistIndicies[i]]
         </li>
         <li class="">
          classCount[voteIlabel] = classCount.get(voteIlabel,
          <span class="number">
           0
          </span>
          ) +
          <span class="number">
           1
          </span>
          <span class="comment">
           # a dict with label as key and occurrence number as value
          </span>
         </li>
         <li class="alt">
          sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(
          <span class="number">
           1
          </span>
          ), reverse=
          <span class="special">
           True
          </span>
          )
         </li>
         <li class="">
          <span class="string">
           ”
          </span>
          <span class="comment">
           ”’descend sorted according to value, ”’
          </span>
         </li>
         <li class="alt">
          <span class="keyword">
           return
          </span>
          sortedClassCount[
          <span class="number">
           0
          </span>
          ][
          <span class="number">
           0
          </span>
          ]
         </li>
         <li class="">
         </li>
         <li class="alt">
         </li>
         <li class="">
          <span class="keyword">
           def
          </span>
          file2matrix(filename):
         </li>
         <li class="alt">
          fr = open(filename)
         </li>
         <li class="">
          <span class="comment">
           #pdb.set_trace()
          </span>
         </li>
         <li class="alt">
          L = fr.readlines()
         </li>
         <li class="">
          numberOfLines = len(L)
          <span class="comment">
           #get the number of lines in the file
          </span>
         </li>
         <li class="alt">
          returnMat = zeros((numberOfLines,
          <span class="number">
           3
          </span>
          ))
          <span class="comment">
           #prepare matrix to return
          </span>
         </li>
         <li class="">
          classLabelVector = []
          <span class="comment">
           #prepare labels return
          </span>
         </li>
         <li class="alt">
          index =
          <span class="number">
           0
          </span>
         </li>
         <li class="">
          <span class="keyword">
           for
          </span>
          line
          <span class="keyword">
           in
          </span>
          L:
         </li>
         <li class="alt">
          line = line.strip()
         </li>
         <li class="">
          listFromLine = line.split(
          <span class="string">
           ‘\t’
          </span>
          )
         </li>
         <li class="alt">
          returnMat[index,:] = listFromLine[
          <span class="number">
           0
          </span>
          :
          <span class="number">
           3
          </span>
          ]
         </li>
         <li class="">
          classLabelVector.append(int(listFromLine[-
          <span class="number">
           1
          </span>
          ]))
         </li>
         <li class="alt">
          <span class="comment">
           #classLabelVector.append((listFromLine[-1]))
          </span>
         </li>
         <li class="">
          index +=
          <span class="number">
           1
          </span>
         </li>
         <li class="alt">
          fr.close()
         </li>
         <li class="">
          <span class="keyword">
           return
          </span>
          returnMat,classLabelVector
         </li>
         <li class="alt">
         </li>
         <li class="">
          <span class="keyword">
           def
          </span>
          plotscattter():
         </li>
         <li class="alt">
          datingDataMat,datingLabels = file2matrix(
          <span class="string">
           ‘datingTestSet2.txt’
          </span>
          )
          <span class="comment">
           #load data setfrom file
          </span>
         </li>
         <li class="">
          fig = plt.figure()
         </li>
         <li class="alt">
          ax1 = fig.add_subplot(
          <span class="number">
           111
          </span>
          )
         </li>
         <li class="">
          ax2 = fig.add_subplot(
          <span class="number">
           111
          </span>
          )
         </li>
         <li class="alt">
          ax3 = fig.add_subplot(
          <span class="number">
           111
          </span>
          )
         </li>
         <li class="">
          ax1.scatter(datingDataMat[:,
          <span class="number">
           0
          </span>
          ],datingDataMat[:,
          <span class="number">
           1
          </span>
          ],
          <span class="number">
           15.0
          </span>
          *array(datingLabels),
          <span class="number">
           15.0
          </span>
          *array(datingLabels))
         </li>
         <li class="alt">
          <span class="comment">
           #ax2.scatter(datingDataMat[:,0],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))
          </span>
         </li>
         <li class="">
          <span class="comment">
           #ax2.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))
          </span>
         </li>
         <li class="alt">
          plt.show()
         </li>
         <li class="">
         </li>
         <li class="alt">
         </li>
         <li class="">
          <span class="keyword">
           def
          </span>
          autoNorm(dataSet):
         </li>
         <li class="alt">
          minVals = dataSet.min(
          <span class="number">
           0
          </span>
          )
         </li>
         <li class="">
          maxVals = dataSet.max(
          <span class="number">
           0
          </span>
          )
         </li>
         <li class="alt">
          ranges = maxVals – minVals
         </li>
         <li class="">
          normDataSet = zeros(shape(dataSet))
         </li>
         <li class="alt">
          m = dataSet.shape[
          <span class="number">
           0
          </span>
          ]
         </li>
         <li class="">
          normDataSet = dataSet – tile(minVals, (m,
          <span class="number">
           1
          </span>
          ))
         </li>
         <li class="alt">
          normDataSet = normDataSet/tile(ranges, (m,
          <span class="number">
           1
          </span>
          ))
          <span class="comment">
           #element wise divide
          </span>
         </li>
         <li class="">
          <span class="keyword">
           return
          </span>
          normDataSet, ranges, minVals
         </li>
         <li class="alt">
         </li>
         <li class="">
          <span class="keyword">
           def
          </span>
          datingClassTest(hoRatio =
          <span class="number">
           0.20
          </span>
          ):
         </li>
         <li class="alt">
          <span class="comment">
           #hold out 10%
          </span>
         </li>
         <li class="">
          datingDataMat,datingLabels = file2matrix(
          <span class="string">
           ‘datingTestSet2.txt’
          </span>
          )
          <span class="comment">
           #load data setfrom file
          </span>
         </li>
         <li class="alt">
          normMat, ranges, minVals = autoNorm(datingDataMat)
         </li>
         <li class="">
          m = normMat.shape[
          <span class="number">
           0
          </span>
          ]
         </li>
         <li class="alt">
          numTestVecs = int(m*hoRatio)
         </li>
         <li class="">
          errorCount =
          <span class="number">
           0.0
          </span>
         </li>
         <li class="alt">
          <span class="keyword">
           for
          </span>
          i
          <span class="keyword">
           in
          </span>
          range(numTestVecs):
         </li>
         <li class="">
          classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],
          <span class="number">
           3
          </span>
          )
         </li>
         <li class="alt">
          <span class="keyword">
           print
          </span>
          <span class="string">
           “the classifier came back with: %d, the real answer is: %d”
          </span>
          % (classifierResult, datingLabels[i])
         </li>
         <li class="">
          <span class="keyword">
           if
          </span>
          (classifierResult != datingLabels[i]): errorCount +=
          <span class="number">
           1.0
          </span>
         </li>
         <li class="alt">
          <span class="keyword">
           print
          </span>
          <span class="string">
           “the total error rate is: %.2f%%”
          </span>
          % (
          <span class="number">
           100
          </span>
          *errorCount/float(numTestVecs))
         </li>
         <li class="">
          <span class="keyword">
           print
          </span>
          <span class="string">
           ‘testcount is %s, errorCount is %s’
          </span>
          %(numTestVecs,errorCount)
         </li>
         <li class="alt">
         </li>
         <li class="">
          <span class="keyword">
           def
          </span>
          classifyPerson():
         </li>
         <li class="alt">
          <span class="string">
           ”
          </span>
          <span class="comment">
           ”’
          </span>
         </li>
         <li class="">
          <span class="comment">
           input a person , decide like or not, then update the DB
          </span>
         </li>
         <li class="alt">
          <span class="comment">
           ”’
          </span>
         </li>
         <li class="">
          resultlist = [
          <span class="string">
           ‘not at all’
          </span>
          ,
          <span class="string">
           ‘little doses’
          </span>
          ,
          <span class="string">
           ‘large doses’
          </span>
          ]
         </li>
         <li class="alt">
          percentTats = float(raw_input(
          <span class="string">
           ‘input the person\’ percentage of time playing video games:’
          </span>
          ))
         </li>
         <li class="">
          ffMiles = float(raw_input(
          <span class="string">
           ‘flier miles in a year:’
          </span>
          ))
         </li>
         <li class="alt">
          iceCream = float(raw_input(
          <span class="string">
           ‘amount of iceCream consumed per year:’
          </span>
          ))
         </li>
         <li class="">
          datingDataMat,datingLabels = file2matrix(
          <span class="string">
           ‘datingTestSet2.txt’
          </span>
          )
         </li>
         <li class="alt">
          normMat, ranges, minVals = autoNorm(datingDataMat)
         </li>
         <li class="">
          normPerson = (array([ffMiles,percentTats,iceCream])-minVals)/ranges
         </li>
         <li class="alt">
          result = classify0(normPerson, normMat, datingLabels,
          <span class="number">
           3
          </span>
          )
         </li>
         <li class="">
          <span class="keyword">
           print
          </span>
          <span class="string">
           ‘you will probably like this guy in:’
          </span>
          , resultlist[result –
          <span class="number">
           1
          </span>
          ]
         </li>
         <li class="alt">
         </li>
         <li class="">
          <span class="comment">
           #update the datingTestSet
          </span>
         </li>
         <li class="alt">
          <span class="keyword">
           print
          </span>
          <span class="string">
           ‘update dating DB’
          </span>
         </li>
         <li class="">
          tmp =
          <span class="string">
           ‘\t’
          </span>
          .join([repr(ffMiles),repr(percentTats),repr(iceCream),repr(result)])+
          <span class="string">
           ‘\n’
          </span>
         </li>
         <li class="alt">
         </li>
         <li class="">
          with open(
          <span class="string">
           ‘datingTestSet2.txt’
          </span>
          ,
          <span class="string">
           ‘a’
          </span>
          ) as fr:
         </li>
         <li class="alt">
          fr.write(tmp)
         </li>
         <li class="">
         </li>
         <li class="alt">
          <span class="keyword">
           def
          </span>
          img2file(filename):
         </li>
         <li class="">
          <span class="comment">
           #vector = zeros(1,1024)
          </span>
         </li>
         <li class="alt">
          with open(filename) as fr:
         </li>
         <li class="">
          L=fr.readlines()
         </li>
         <li class="alt">
          vector =[int(L[i][j])
          <span class="keyword">
           for
          </span>
          i
          <span class="keyword">
           in
          </span>
          range(
          <span class="number">
           32
          </span>
          )
          <span class="keyword">
           for
          </span>
          j
          <span class="keyword">
           in
          </span>
          range(
          <span class="number">
           32
          </span>
          )]
         </li>
         <li class="">
          <span class="keyword">
           return
          </span>
          array(vector,dtype = float)
         </li>
         <li class="alt">
         </li>
         <li class="">
         </li>
         <li class="alt">
          <span class="keyword">
           def
          </span>
          handwritingClassTest():
         </li>
         <li class="">
          hwLabels = []
         </li>
         <li class="alt">
          trainingFileList = listdir(
          <span class="string">
           ‘trainingDigits’
          </span>
          )
          <span class="comment">
           #load the training set
          </span>
         </li>
         <li class="">
          m = len(trainingFileList)
         </li>
         <li class="alt">
          trainingMat = zeros((m,
          <span class="number">
           1024
          </span>
          ))
         </li>
         <li class="">
          <span class="keyword">
           for
          </span>
          i
          <span class="keyword">
           in
          </span>
          range(m):
         </li>
         <li class="alt">
          fileNameStr = trainingFileList[i]
         </li>
         <li class="">
          fileStr = fileNameStr.split(
          <span class="string">
           ‘.’
          </span>
          )[
          <span class="number">
           0
          </span>
          ]
          <span class="comment">
           #take off .txt
          </span>
         </li>
         <li class="alt">
          classNumStr = int(fileStr.split(
          <span class="string">
           ‘_’
          </span>
          )[
          <span class="number">
           0
          </span>
          ])
         </li>
         <li class="">
          hwLabels.append(classNumStr)
         </li>
         <li class="alt">
          trainingMat[i,:] = img2vector(
          <span class="string">
           ‘trainingDigits/%s’
          </span>
          % fileNameStr)
         </li>
         <li class="">
          testFileList = listdir(
          <span class="string">
           ‘testDigits’
          </span>
          )
          <span class="comment">
           #iterate through the test set
          </span>
         </li>
         <li class="alt">
          errorCount =
          <span class="number">
           0.0
          </span>
         </li>
         <li class="">
          mTest = len(testFileList)
         </li>
         <li class="alt">
          <span class="keyword">
           for
          </span>
          i
          <span class="keyword">
           in
          </span>
          range(mTest):
         </li>
         <li class="">
          fileNameStr = testFileList[i]
         </li>
         <li class="alt">
          fileStr = fileNameStr.split(
          <span class="string">
           ‘.’
          </span>
          )[
          <span class="number">
           0
          </span>
          ]
          <span class="comment">
           #take off .txt
          </span>
         </li>
         <li class="">
          classNumStr = int(fileStr.split(
          <span class="string">
           ‘_’
          </span>
          )[
          <span class="number">
           0
          </span>
          ])
         </li>
         <li class="alt">
          vectorUnderTest = img2vector(
          <span class="string">
           ‘testDigits/%s’
          </span>
          % fileNameStr)
         </li>
         <li class="">
          classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels,
          <span class="number">
           3
          </span>
          )
         </li>
         <li class="alt">
          <span class="keyword">
           print
          </span>
          <span class="string">
           “the classifier came back with: %d, the real answer is: %d”
          </span>
          % (classifierResult, classNumStr)
         </li>
         <li class="">
          <span class="keyword">
           if
          </span>
          (classifierResult != classNumStr): errorCount +=
          <span class="number">
           1.0
          </span>
         </li>
         <li class="alt">
          <span class="keyword">
           print
          </span>
          <span class="string">
           “\nthe total number of errors is: %d”
          </span>
          % errorCount
         </li>
         <li class="">
          <span class="keyword">
           print
          </span>
          <span class="string">
           “\nthe total error rate is: %f”
          </span>
          % (errorCount/float(mTest))
         </li>
         <li class="alt">
         </li>
         <li class="">
          <span class="keyword">
           if
          </span>
          __name__ ==
          <span class="string">
           ‘__main__’
          </span>
          :
         </li>
         <li class="alt">
          datingClassTest()
         </li>
         <li class="">
          <span class="comment">
           #handwritingClassTest()
          </span>
         </li>
        </ol>
       </div>
       <p>
       </p>
       <p>
        （四）KNN回归
       </p>
       <p>
        数据点的类别标签是连续值时应用KNN算法就是回归，与KNN分类算法过程相同，区别在于对K个邻居的处理上。KNN回归是取K个邻居类标签值得加权作为新数据点的预测值。加权方法有：K个近邻的属性值的平均值（最差）、1/d为权重（有效的衡量邻居的权重，使较近邻居的权重比较远邻居的权重大）、
        <strong>
         高斯函数
        </strong>
        （或者其他适当的减函数）计算权重= gaussian(distance) （距离越远得到的值就越小，加权得到更为准确的估计。
       </p>
       <h1>
        <p name="t3">
        </p>
        （五）总结
       </h1>
       <p>
        K-近邻算法是分类数据最简单最有效的算法，其学习基于实例，使用算法时我们必须有接近实际数据的训练样本数据。K-近邻算法必须保存全部数据集，如果训练数据集的很大，必须使用大量的存储空间。此外,由于必须对数据集中的每个数据计算距离值，实际使用时可能非常耗时。k-近邻算法的另一个缺陷是它无法给出任何数据的基础结构信息，因此我们也无法知晓平均实例样本和典型实例样本具有什么特征。
       </p>
       <p>
       </p>
       <p>
        文章出处：
        <a href="http://blog.csdn.net/suipingsp">
         Adan
        </a>
       </p>
      </div>
      <div>
       <strong>
        注：转载文章均来自于公开网络，仅供学习使用，不会用于任何商业用途，如果侵犯到原作者的权益，请您与我们联系删除或者授权事宜，联系邮箱：contact@dataunion.org。转载数盟网站文章请注明原文章作者，否则产生的任何版权纠纷与数盟无关。
       </strong>
      </div>
      <!--content_text-->
      <div class="fenxian">
       <!-- JiaThis Button BEGIN -->
       <div class="jiathis_style_32x32">
        <p class="jiathis_button_weixin">
        </p>
        <p class="jiathis_button_tsina">
        </p>
        <p class="jiathis_button_qzone">
        </p>
        <p class="jiathis_button_cqq">
        </p>
        <p class="jiathis_button_tumblr">
        </p>
        <a class="jiathis jiathis_txt jtico jtico_jiathis" href="http://www.jiathis.com/share" target="_blank">
        </a>
        <p class="jiathis_counter_style">
        </p>
       </div>
       <!-- JiaThis Button END -->
      </div>
     </article>
     <!--content-->
     <!--相关文章-->
     <div class="xianguan">
      <div class="xianguantitle">
       相关文章！
      </div>
      <ul class="pic">
       <li>
        <a href="http://dataunion.org/20758.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/09/t012aec1078cd96f01f-300x199.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/20758.html" rel="bookmark" title="推荐一些从零开始学习机器学习算法的方法">
         推荐一些从零开始学习机器学习算法的方法
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/20714.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/09/t011650727f6392a3f5-300x197.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/20714.html" rel="bookmark" title="寻找最优参数解：最速下降法，牛顿下降法，阻尼牛顿法，拟牛顿法DFP/BFGS">
         寻找最优参数解：最速下降法，牛顿下降法，阻尼牛顿法，拟牛顿法DFP/BFGS
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/20636.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/09/t01034a6a3b660f0c04_副本-300x203.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/20636.html" rel="bookmark" title="机器学习开发者的现代化攻略：对统计学微积分Say NO！">
         机器学习开发者的现代化攻略：对统计学微积分Say NO！
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/20632.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/08/t01e4f9fea2b69f4b1f-300x189.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/20632.html" rel="bookmark" title="机器学习到底适合哪些人群学习？">
         机器学习到底适合哪些人群学习？
        </a>
       </li>
      </ul>
     </div>
     <!--相关文章-->
     <div class="comment" id="comments">
      <!-- You can start editing here. -->
      <!-- If comments are open, but there are no comments. -->
      <div class="title">
       期待你一针见血的评论，Come on！
      </div>
      <div id="respond">
       <p>
        不用想啦，马上
        <a href="http://dataunion.org/wp-login.php?redirect_to=http%3A%2F%2Fdataunion.org%2F4237.html">
         "登录"
        </a>
        发表自已的想法.
       </p>
      </div>
     </div>
     <!-- .nav-single -->
    </div>
    <!--Container End-->
    <aside id="sitebar">
     <div class="sitebar_list2">
      <div class="wptag">
       <span class="tagtitle">
        热门标签+
       </span>
       <div class="tagg">
        <ul class="menu" id="menu-%e5%8f%8b%e6%83%85%e9%93%be%e6%8e%a5">
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1605" id="menu-item-1605">
          <a href="http://taidizh.com/">
           泰迪智慧
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20884" id="menu-item-20884">
          <a href="http://www.transwarp.cn/">
           星环科技
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-3538" id="menu-item-3538">
          <a href="http://datall.org/">
           珈和遥感
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20888" id="menu-item-20888">
          <a href="http://www.chinahadoop.cn/">
           小象学院
          </a>
         </li>
        </ul>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <div class="textwidget">
       <div align="center">
        <a href="http://study.163.com/course/courseMain.htm?courseId=991022" target="_blank">
         <img src="http://dataunion.org/wp-content/uploads/2016/03/dv.jpg"/>
        </a>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       文章分类
      </h4>
      <div class="tagcloud">
       <a class="tag-link-44" href="http://dataunion.org/category/industry/demo" style="font-size: 10.204724409449pt;" title="4个话题">
        Demo展示
       </a>
       <a class="tag-link-31" href="http://dataunion.org/category/experts" style="font-size: 15.826771653543pt;" title="52个话题">
        专家团队
       </a>
       <a class="tag-link-870" href="http://dataunion.org/category/tech/ai" style="font-size: 19.795275590551pt;" title="273个话题">
        人工智能
       </a>
       <a class="tag-link-488" href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f" style="font-size: 8pt;" title="1个话题">
        加入数盟
       </a>
       <a class="tag-link-869" href="http://dataunion.org/category/tech/viz" style="font-size: 17.204724409449pt;" title="93个话题">
        可视化
       </a>
       <a class="tag-link-30" href="http://dataunion.org/category/partners" style="font-size: 10.645669291339pt;" title="5个话题">
        合作伙伴
       </a>
       <a class="tag-link-889" href="http://dataunion.org/category/parterc" style="font-size: 11.582677165354pt;" title="8个话题">
        合作会议
       </a>
       <a class="tag-link-104" href="http://dataunion.org/category/books" style="font-size: 12.96062992126pt;" title="15个话题">
        图书
       </a>
       <a class="tag-link-220" href="http://dataunion.org/category/tech/base" style="font-size: 19.850393700787pt;" title="281个话题">
        基础架构
       </a>
       <a class="tag-link-219" href="http://dataunion.org/category/tech/analysis" style="font-size: 19.409448818898pt;" title="232个话题">
        数据分析
       </a>
       <a class="tag-link-887" href="http://dataunion.org/category/tech/dm" style="font-size: 13.291338582677pt;" title="17个话题">
        数据挖掘
       </a>
       <a class="tag-link-34" href="http://dataunion.org/category/tech" style="font-size: 20.732283464567pt;" title="404个话题">
        文章
       </a>
       <a class="tag-link-1" href="http://dataunion.org/category/uncategorized" style="font-size: 22pt;" title="693个话题">
        未分类
       </a>
       <a class="tag-link-4" href="http://dataunion.org/category/events" style="font-size: 14.503937007874pt;" title="29个话题">
        活动
       </a>
       <a class="tag-link-890" href="http://dataunion.org/category/tech/%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0" style="font-size: 10.204724409449pt;" title="4个话题">
        深度学习
       </a>
       <a class="tag-link-221" href="http://dataunion.org/category/tech/devl" style="font-size: 18.968503937008pt;" title="193个话题">
        编程语言
       </a>
       <a class="tag-link-888" href="http://dataunion.org/category/career" style="font-size: 15.661417322835pt;" title="48个话题">
        职业规划
       </a>
       <a class="tag-link-5" href="http://dataunion.org/category/jobs" style="font-size: 14.11811023622pt;" title="25个话题">
        职位
       </a>
       <a class="tag-link-871" href="http://dataunion.org/category/industry" style="font-size: 15.716535433071pt;" title="49个话题">
        行业
       </a>
       <a class="tag-link-613" href="http://dataunion.org/category/industry/case" style="font-size: 16.984251968504pt;" title="84个话题">
        行业应用
       </a>
       <a class="tag-link-885" href="http://dataunion.org/category/industry/news" style="font-size: 17.425196850394pt;" title="102个话题">
        行业资讯
       </a>
       <a class="tag-link-10" href="http://dataunion.org/category/training" style="font-size: 14.228346456693pt;" title="26个话题">
        课程
       </a>
       <a class="tag-link-16" href="http://dataunion.org/category/sources" style="font-size: 15.661417322835pt;" title="48个话题">
        资源
       </a>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       功能
      </h4>
      <ul>
       <li>
        <a href="http://dataunion.org/wp-login.php?action=register">
         注册
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/wp-login.php">
         登录
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/feed">
         文章
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/comments/feed">
         评论
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="https://cn.wordpress.org/" title="基于WordPress，一个优美、先进的个人信息发布平台。">
         WordPress.org
        </a>
       </li>
      </ul>
     </div>
    </aside>
    <div class="clear">
    </div>
   </div>
   <!--main-->
   ﻿
   <footer id="dibu">
    <div class="about">
     <div class="right">
      <ul class="menu" id="menu-%e5%ba%95%e9%83%a8%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-18024" id="menu-item-18024">
        <a href="http://dataunion.org/category/partners">
         合作伙伴
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20881" id="menu-item-20881">
        <a href="http://dataunion.org/contribute">
         文章投稿
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20872" id="menu-item-20872">
        <a href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f">
         加入数盟
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22441" id="menu-item-22441">
        <a href="http://dataunion.org/f-links">
         友情链接
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20874" id="menu-item-20874">
        <a href="http://dataunion.org/aboutus">
         关于数盟
        </a>
       </li>
      </ul>
      <p class="banquan">
       数盟社区        ，
        做最棒的数据科学社区
      </p>
     </div>
     <div class="left">
      <ul class="bottomlist">
       <li>
        <a href="http://weibo.com/DataScientistUnion  " target="_blank" 　title="">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weibo.png"/>
        </a>
       </li>
       <li>
        <a class="cd-popup-trigger" href="http://dataunion.org/4237.html#0">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weixin.png"/>
        </a>
       </li>
      </ul>
      <div class="cd-popup">
       <div class="cd-popup-container">
        <h1>
         扫描二维码,加微信公众号
        </h1>
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/2014-12-06-1515289049.png"/>
        <a class="cd-popup-close" href="http://dataunion.org/4237.html">
        </a>
       </div>
       <!-- cd-popup-container -->
      </div>
      <!-- cd-popup -->
     </div>
    </div>
    <!--about-->
    <div class="bottom">
     <a href="http://dataunion.org/">
      数盟社区
     </a>
     <a href="http://www.miitbeian.gov.cn/" rel="external nofollow" target="_blank">
      京ICP备14026740号
     </a>
     联系我们：
     <a href="mailto:contact@dataunion.org" target="_blank">
      contact@dataunion.org
     </a>
     <div class="tongji">
     </div>
     <!--bottom-->
     <div class="scroll" id="scroll" style="display:none;">
      ︿
     </div>
    </div>
   </footer>
   <!--dibu-->
  </div>
 </body>
</html>